<?php

class SubsidiosController extends AppController {

    public function eliminar() {
        set_time_limit(1 * 60 * 60);

        $this->maint = getData('Subsidios/SubsidiosEliminarMaint');

        if ($this->request->is('post') || $this->request->is('put')) {
            // Incluye la libreria PHPExcel
            App::import('Lib', 'PHPExcel');

            if (empty($this->request->data['Subsidio']['tmp_columna'])) {
                $this->Session->setFlash(__('No se especificó la columna que contiene los expedientes'));
                $this->redirect(array('action' => 'eliminar'));
            } else {
                $col = strtoupper($this->request->data['Subsidio']['tmp_columna']);
            }

            // Carga el archivo Excel
            $objPHPExcel = PHPExcel_IOFactory::load($this->request->data['Subsidio']['tmp_excel']['tmp_name']);

            // Inicia la transaccion SQL
            $dataSource = $this->Subsidio->getDataSource();
            $dataSource->begin();

            // Recorro cada hoja del Excel
            $filas = 0;
            foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
                // Recorro cada fila de la hoja
                foreach ($worksheet->getRowIterator() as $row) {
                    $cell = $worksheet->getCellByColumnAndRow($col, $row->getRowIndex());
                    $val = $cell->getValue();
                    
                    debug($cell->getIndex());
                    die;
                    
                    if (!empty($val) && is_numeric($val)) {
                        $subsidio = $this->Subsidio->findByNumero($val);
                        if (isset($subsidio['Subsidio']['id'])) {
                            try {
                                $filas++;
                                $this->Subsidio->Query("UPDATE sub_subsidios SET en_ruta='Verificado' WHERE id=" . $subsidio['Subsidio']['id']);
                            } catch (exception $ex) {
                                $dataSource->rollback();
                                $this->Session->setFlash(__('Los registros no pudieron ser eliminados'));
                                break;
                            }
                        }
                    }
                }
            }

            // Salgo para que recorra solo el primer worksheet
            break;

            // Termina la transaccion SQL
            $dataSource->commit();

            // Retorna al index
            $this->Session->setFlash(__('Fueron eliminados ' . $filas . ' registro' . ($filas == 1 ? '' : 's')));
            $this->redirect(array('action' => isset($this->maint['return']) ? $this->maint['return'] : "index"));
        }

        parent::add();
    }

    public function verificate() {
        set_time_limit(1 * 60 * 60);

        $this->maint = getData('Subsidios/SubsidiosVerificarMaint');

        if ($this->request->is('post') || $this->request->is('put')) {
            // Incluye la libreria PHPExcel
            App::import('Lib', 'PHPExcel');

            // Carga el archivo Excel
            $objPHPExcel = PHPExcel_IOFactory::load($this->request->data['Subsidio']['tmp_excel']['tmp_name']);

            // Saco el excel del POST para que no lo suba el archivo al servidor
            unset($this->request->data['Subsidio']['tmp_excel']);

            // Obtiene los valores de los campos de acuerdo a sus presentation
            $request_data = $this->processData($this->request->data, "fields");

            $subsidios = array();

            // Inicia la transaccion SQL
            $dataSource = $this->Subsidio->getDataSource();
            $dataSource->begin();

            // Recorro cada hoja del Excel
            $filas = 0;
            foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
                // Recorro cada fila de la hoja
                foreach ($worksheet->getRowIterator() as $row) {
                    //$fila = $row->getRowIndex(); //1,2,3...
                    // Recupero una fila
                    $cellIterator = $row->getCellIterator();
                    $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
                    foreach ($cellIterator as $cell) {
                        if (!is_null($cell)) {
                            $ord = ord(substr($cell->getCoordinate(), 0, 1)) - ord("A"); // A1, B1, etc... de saco la A,B,C ... y finalmente 0,1,2 
                            $val = $cell->getCalculatedValue(); // Valor del campo

                            if ($ord == 2) {
                                $array['Subsidio']['comuna'] = $val;
                            } elseif ($ord == 3) {
                                $array['Subsidio']['numero'] = $val;
                            } elseif ($ord == 5) {
                                $array['Subsidio']['direccion'] = $val;
                            } elseif ($ord == 6) {
                                $array['Subsidio']['direccion'].= ' ' . $val;
                            } elseif ($ord == 4) {
                                $array['Subsidio']['nro_doc'] = $val;
                            }
                        }
                    }

                    if (!empty($array['Subsidio']['numero']) && is_numeric($array['Subsidio']['numero'])) {
                        $subsidio = $this->Subsidio->findByNumero($array['Subsidio']['numero']);
                        if (isset($subsidio['Subsidio']['id'])) {
                            try {
                                // Actualizo el subsidio a Verificado
                                $this->Subsidio->Query("UPDATE sub_subsidios SET en_ruta='Verificado' WHERE id=" . $subsidio['Subsidio']['id']);
                                $subsidios[] = $subsidio['Subsidio']['id'];
                            } catch (exception $ex) {
                                $dataSource->rollback();
                                $this->Session->setFlash(__('Los registros no pudieron ser ingresados'));
                                break;
                            }
                        } else {
                            try {
                                // Subo el subsidio como Verificado
                                $this->Subsidio->Query("INSERT INTO sub_subsidios (fecha_carga, user_id, numero, direccion, nro_doc, comuna, en_ruta)
                                                                           VALUES ('" . $request_data['Subsidio']['fecha_carga'] . "', " . $request_data['Subsidio']['user_id'] . ", " . $array['Subsidio']['numero'] . ", '" . $array['Subsidio']['direccion'] . "', '" . $array['Subsidio']['nro_doc'] . "', '" . $array['Subsidio']['comuna'] . "', 'Verificado')");
                            } catch (exception $ex) {
                                $dataSource->rollback();
                                $this->Session->setFlash(__('Los registros no pudieron ser ingresados'));
                                break;
                            }
                        }
                        $filas++;
                    }
                }

                // Salgo para que recorra solo el primer worksheet
                break;
            }

            // Termina la transaccion SQL
            $dataSource->commit();

            // Seteo las rutas como Realizadas
            $dataSource->begin();
            foreach ($subsidios as $subsidio) {
                // Obtengo la ruta a la que pertenece el subsidio
                $ruta = $this->Subsidio->Query("SELECT ruta_id FROM sub_subsidios_rutas WHERE subsidio_id=" . $subsidio . " LIMIT 1");
                if (!empty($ruta)) {
                    $ruta_id = $ruta[0]['sub_subsidios_rutas']['ruta_id'];

                    // Si existe la ruta y queda completa la dejo como realizada
                    if (!empty($ruta_id)) {
                        $subsidios_ruta = $this->Subsidio->Query("SELECT COUNT(*) as cant
                                                                  FROM sub_subsidios s 
                                                                  JOIN sub_subsidios_rutas sr ON sr.subsidio_id=s.id
                                                                  WHERE sr.ruta_id=" . $ruta_id . " AND en_ruta != 'Verificado'");
                        if ($subsidios_ruta[0][0]['cant'] == 0) {
                            try {
                                $this->Subsidio->Query("UPDATE sub_rutas SET realizada='Si' WHERE id=" . $ruta_id);
                            } catch (exception $ex) {
                                $dataSource->rollback();
                                $this->Session->setFlash(__('Los registros no pudieron ser ingresados'));
                                break;
                            }
                        }
                    }
                }
            }

            $dataSource->commit();

            // Retorna al index
            $this->Session->setFlash(__('Los ' . $filas . ' registros han sido reinsertados correctamente'));
            $this->redirect(array('action' => isset($this->maint['return']) ? $this->maint['return'] : "index"));
        }

        parent::add();
    }

    public function reinsert() {
        set_time_limit(1 * 60 * 60);

        $this->maint = getData('Subsidios/SubsidiosReinsertarMaint');

        if ($this->request->is('post') || $this->request->is('put')) {
            // Incluye la libreria PHPExcel
            App::import('Lib', 'PHPExcel');

            // Carga el archivo Excel
            $objPHPExcel = PHPExcel_IOFactory::load($this->request->data['Subsidio']['tmp_excel']['tmp_name']);

            // Saco el excel del POST para que no lo suba el archivo al servidor
            unset($this->request->data['Subsidio']['tmp_excel']);

            // Inicia la transaccion SQL
            $dataSource = $this->Subsidio->getDataSource();
            $dataSource->begin();

            // Recorro cada hoja del Excel
            $filas = 0;
            foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
                // Recorro cada fila de la hoja
                foreach ($worksheet->getRowIterator() as $row) {
                    $filas++;
                    //$fila = $row->getRowIndex(); //1,2,3...
                    // Recupero una fila
                    $cellIterator = $row->getCellIterator();
                    $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
                    foreach ($cellIterator as $cell) {
                        if (!is_null($cell)) {
                            $ord = ord(substr($cell->getCoordinate(), 0, 1)) - ord("A"); // A1, B1, etc... de saco la A,B,C ... y finalmente 0,1,2 
                            $val = $cell->getCalculatedValue(); // Valor del campo

                            if ($ord == 0) {
                                $expediente = $val;
                            }
                        }
                    }

                    $subsidio = $this->Subsidio->findByNumero($expediente);
                    if (isset($subsidio['Subsidio']) && $subsidio['Subsidio']['en_ruta'] == 'Si') {
                        try {
                            $this->Subsidio->Query("UPDATE sub_subsidios SET en_ruta='No' WHERE id=" . $subsidio['Subsidio']['id']);
                            $this->Subsidio->Query("DELETE FROM sub_subsidios_rutas WHERE subsidio_id=" . $subsidio['Subsidio']['id']);
                        } catch (exception $ex) {
                            $dataSource->rollback();
                            $this->Session->setFlash(__('Los registros no pudieron ser ingresados'));
                            break;
                        }
                    }
                }

                // Salgo para que recorra solo el primer worksheet
                break;
            }

            // Termina la transaccion SQL
            $dataSource->commit();

            // Retorna al index
            $this->Session->setFlash(__('Los ' . $filas . ' registros han sido reinsertados correctamente'));
            $this->redirect(array('action' => isset($this->maint['return']) ? $this->maint['return'] : "index"));
        }

        parent::add();
    }

    public function import() {
        set_time_limit(1 * 60 * 60);

        $this->maint = getData('Subsidios/SubsidiosImportarMaint');

        if ($this->request->is('post')) {
            // Incluye la libreria PHPExcel
            App::import('Lib', 'PHPExcel');

            // Carga el archivo Excel
            $objPHPExcel = PHPExcel_IOFactory::load($this->request->data['Subsidio']['tmp_excel']['tmp_name']);

            // Saco el excel del POST para que no lo suba el archivo al servidor
            unset($this->request->data['Subsidio']['tmp_excel']);

            // Obtiene los valores de los campos de acuerdo a sus presentation
            $request_data = $this->processData($this->request->data, "fields");

            // Inicia la transaccion SQL
            $dataSource = $this->Subsidio->getDataSource();
            $dataSource->begin();

            // Recorro cada hoja del Excel
            $registros = array();
            $filas = 0;
            $over_quota = true;
            foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
                // Recorro cada fila de la hoja
                foreach ($worksheet->getRowIterator() as $row) {
                    //$fila = $row->getRowIndex(); //1,2,3...

                    $array = array(
                        'Subsidio' => array(
                            'fecha_carga' => $request_data['Subsidio']['fecha_carga'],
                            'user_id' => $request_data['Subsidio']['user_id']
                        )
                    );

                    // Recupero una fila
                    $cellIterator = $row->getCellIterator();
                    $cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
                    foreach ($cellIterator as $cell) {
                        if (!is_null($cell)) {
                            $ord = ord(substr($cell->getCoordinate(), 0, 1)) - ord("A"); // A1, B1, etc... de saco la A,B,C ... y finalmente 0,1,2 
                            $val = $cell->getCalculatedValue(); // Valor del campo

                            /*
                              if ($ord == 2) {
                              $array['Subsidio']['numero'] = $val;
                              } elseif ($ord == 3) {
                              $array['Subsidio']['anio'] = $val;
                              } elseif ($ord == 7) {
                              $array['Subsidio']['codigo_trata'] = $val;
                              } elseif ($ord == 11) {
                              $array['Subsidio']['nombre_solicitante'] = $val;
                              } elseif ($ord == 12) {
                              $array['Subsidio']['apellido_solicitante'] = $val;
                              } elseif ($ord == 13) {
                              $array['Subsidio']['tipo_doc'] = $val;
                              } elseif ($ord == 14) {
                              $array['Subsidio']['nro_doc'] = $val;
                              } elseif ($ord == 15) {
                              $array['Subsidio']['telefono'] = $val;
                              } elseif ($ord == 16) {
                              $array['Subsidio']['email'] = $val;
                              } elseif ($ord == 17) {
                              $array['Subsidio']['direccion'] = $val;
                              } elseif ($ord == 18) {
                              $array['Subsidio']['direccion'].= ' ' . $val;
                              } elseif ($ord == 19) {
                              $array['Subsidio']['piso'] = $val;
                              } elseif ($ord == 20) {
                              $array['Subsidio']['barrio'] = $val;
                              } elseif ($ord == 21) {
                              $array['Subsidio']['comuna'] = $val;
                              }
                             */
                            if ($ord == 0) {
                                $array['Subsidio']['numero'] = $val;
                            } elseif ($ord == 1) {
                                $array['Subsidio']['anio'] = $val;
                            } elseif ($ord == 2) {
                                $array['Subsidio']['codigo_trata'] = $val;
                            } elseif ($ord == 3) {
                                $array['Subsidio']['descripcion_extracto'] = $val;
                            } elseif ($ord == 4) {
                                $array['Subsidio']['nombre_solicitante'] = $val;
                            } elseif ($ord == 5) {
                                $array['Subsidio']['apellido_solicitante'] = $val;
                            } elseif ($ord == 6) {
                                $array['Subsidio']['tipo_doc'] = $val;
                            } elseif ($ord == 7) {
                                $array['Subsidio']['nro_doc'] = $val;
                            } elseif ($ord == 8) {
                                $array['Subsidio']['telefono'] = $val;
                            } elseif ($ord == 9) {
                                $array['Subsidio']['email'] = $val;
                            } elseif ($ord == 10) {
                                $array['Subsidio']['direccion'] = $val;
                            } elseif ($ord == 11) {
                                $array['Subsidio']['direccion'].= ' ' . $val;
                            } elseif ($ord == 12) {
                                $array['Subsidio']['piso'] = $val;
                            } elseif ($ord == 13) {
                                $array['Subsidio']['barrio'] = $val;
                            } elseif ($ord == 14) {
                                $array['Subsidio']['comuna'] = $val;
                            } elseif ($ord == 15) {
                                $array['Subsidio']['piso'].= ' ' . $val;
                            }
                        }
                    }

                    if (!empty($array['Subsidio']['numero']) && is_numeric($array['Subsidio']['numero'])) {
                        // Si ya existe el subsidio en la base sigo con el siguiente
                        $subsidio = $this->Subsidio->findByNumero($array['Subsidio']['numero']);
                        if (isset($subsidio['Subsidio']['id'])) {
                            continue;
                        }

                        if (!$over_quota) {
                            $url_google = "http://maps.googleapis.com/maps/api/geocode/json?address=" . urlencode(trim($array['Subsidio']['direccion']) . ", Ciudad de Buenos Aires, Argentina") . "&sensor=false";
                            $json = file_get_contents($url_google);
                            $jdata = json_decode($json, true);

                            if ($jdata['status'] == "OVER_QUERY_LIMIT") {
                                $over_quota = true;
                            } elseif ($jdata['status'] == "OK" && count($jdata['results'])) {
                                foreach ($jdata['results'][0]['address_components'] as $comp) {
                                    if ($comp['types'][0] == 'street_number') {
                                        $array['Subsidio']['altura'] = $comp['long_name'];
                                    } elseif ($comp['types'][0] == 'route') {
                                        $array['Subsidio']['calle'] = $comp['long_name'];
                                    } elseif ($comp['types'][0] == 'neighborhood') {
                                        $array['Subsidio']['barrio'] = $comp['long_name'];
                                    }
                                }

                                if (isset($array['Subsidio']['altura']) && isset($array['Subsidio']['altura']) && isset($array['Subsidio']['barrio']) && isset($jdata['results'][0]['geometry']['location'])) {
                                    $array['Subsidio']['coordenadas'] = $jdata['results'][0]['geometry']['location']['lat'] . "," . $jdata['results'][0]['geometry']['location']['lng'];
                                    $array['Subsidio']['estado_geo'] = 'Geolocalizado';
                                } else {
                                    $array['Subsidio']['estado_geo'] = 'No geolocalizable';
                                }
                            }
                        }

                        $filas++;
                        $registros[] = $array;
                    }
                }

                // Salgo para que recorra solo el primer worksheet
                break;
            }

            // Trata de guardarlo
            if (!$this->Subsidio->saveAll($registros)) {
                $dataSource->rollback();
                $this->Session->setFlash(__('Los registros no pudieron ser ingresados'));
            }

            // Termina la transaccion SQL
            $dataSource->commit();

            // Actualiza las comunas que estan mal
            $sql = file_get_contents(ROOT . DS . 'script.sql');
            $this->Subsidio->Query($sql);

            // Retorna al index
            $this->Session->setFlash(__('Los ' . $filas . ' registros han sido ingresados correctamente'));
            $this->redirect(array('action' => isset($this->maint['return']) ? $this->maint['return'] : "index"));
        }

        parent::add();
    }

    public function add() {
        $this->maint = getData('Subsidios/SubsidiosMaint');
        parent::add();
    }

    public function edit($id = null) {
        if ($this->request->is('post')) {
            if ($this->request->data['Subsidio']['en_ruta'] == "No") {
                $this->Subsidio->Query("DELETE FROM sub_subsidios_rutas WHERE subsidio_id=" . $this->request->data['Subsidio']['id']);
            } elseif ($this->request->data['Subsidio']['en_ruta'] == "Verificado") {
                // Obtengo la ruta a la que pertenece el subsidio
                $ruta = $this->Subsidio->Query("SELECT ruta_id FROM sub_subsidios_rutas WHERE subsidio_id=" . $this->request->data['Subsidio']['id']);
                $ruta_id = $ruta[0]['sub_subsidios_rutas']['ruta_id'];

                // Si existe la ruta y queda completa la dejo como realizada
                if (!empty($ruta_id)) {
                    $subsidios_ruta = $this->Subsidio->Query("SELECT COUNT(*) as cant
                                                              FROM sub_subsidios s 
                                                              JOIN sub_subsidios_rutas sr ON sr.subsidio_id=s.id
                                                              WHERE sr.ruta_id=" . $ruta_id . " AND s.en_ruta != 'Verificado' AND s.id!=" . $this->request->data['Subsidio']['id']);
                    if ($subsidios_ruta[0][0]['cant'] == 0) {
                        $this->Subsidio->Query("UPDATE sub_rutas SET realizada='Si' WHERE id=" . $ruta_id);
                    }
                }
            }
        }

        $this->maint = getData('Subsidios/SubsidiosMaint');
        parent::edit($id);
    }

    public function index($last = false) {
        $this->search_list = getData('Subsidios/SubsidiosSL');
        parent::index($last);
    }

    public function view($id = null) {
        $this->maint = getData('Subsidios/SubsidiosMaint');
        parent::view($id);
    }

}